home *** CD-ROM | disk | FTP | other *** search
- /* FakeDefIcon.e -- a program to do what Icon should do... */
- /* Copyright (c) 1994, Jason R. Hulance */
-
- OPT OSVERSION=37
-
- MODULE 'exec/ports', 'exec/tasks', 'exec/memory', 'exec/io', 'exec/lists',
- 'whatis', 'utility/tagitem', 'utility', 'intuition/intuition',
- 'icon', 'dos/dos', 'dos/dosextens', 'workbench/workbench'
-
- CONST OFF_EXAM=$ff9a /* dosbase offset of Examine() */
- CONST OFF_EXNEXT=$ff94 /* dosbase offset of ExNext() */
- CONST OFF_OPEN=$ffe2 /* dosbase offset of Open() */
- CONST OFF_OW=$fda2 /* intuitionbase offset of OpenWindowTagList() */
- CONST OFF_ADDG=$fe4a /* intuitionbase offset of AddGList() */
-
- /* WhatIs constants */
- CONST CMP_EQUAL=0, TYPE_UNSCANNED=0, TYPE_UNKNOWNFILETYPE=$FFFE,
- TYPE_UNKNOWNIDSTRING=$FFFFFFFF, LIGHTTYPE=0, DEEPTYPE=1,
- WI_FIB=TAG_USER+202, WI_DEEP=TAG_USER+203
-
- CONST NOT_FOUND=-1, QUOTE=34
-
- ENUM NO_ERR, LIB_ERR, SETF_ERR, ARGS_ERR
-
- /* Override the list node definition with a bigger one */
- OBJECT ln
- succ, pred
- dum_type:CHAR, dum_pri:CHAR
- name
- type
- ENDOBJECT
-
- DEF namelist:lh, debug=0, fake, icontype, exetype, win=NIL:PTR TO window
-
- RAISE LIB_ERR IF OpenLibrary()=NIL,
- SETF_ERR IF SetFunction()=NIL,
- ARGS_ERR IF ReadArgs()=NIL
-
- PROC main() HANDLE
- DEF old_exam=NIL, old_exnext=NIL, old_open=NIL, old_ow=NIL,
- old_addg=NIL, rdargs=NIL, args:PTR TO LONG
- args:=[0,0]
- rdargs:=ReadArgs('NOFAKE/S,DEBUG/N', args, NIL)
- fake:=Not(args[])
- debug:=args[1]
- IF debug
- debug:=^debug
- IF debug THEN WriteF('')
- ENDIF
- namelist.head:=namelist+4
- namelist.tail:=NIL
- namelist.tailpred:=namelist
- whatisbase:=OpenLibrary('whatis.library', NIL)
- exetype:=GetIDType('Exe')
- icontype:=GetIDType('Icon')
- utilitybase:=OpenLibrary('utility.library', 37)
- iconbase:=OpenLibrary('icon.library', 37)
- old_exam:=SetFunction(dosbase, OFF_EXAM, {new_exam})
- PutLong({patch_exam}, old_exam)
- IF fake
- old_exnext:=SetFunction(dosbase, OFF_EXNEXT, {new_exnext})
- PutLong({patch_exnext}, old_exnext)
- old_open:=SetFunction(dosbase, OFF_OPEN, {new_open})
- PutLong({patch_open}, old_open)
- ENDIF
- old_ow:=SetFunction(intuitionbase, OFF_OW, {new_ow})
- PutLong({patch_ow}, old_ow)
- old_addg:=SetFunction(intuitionbase, OFF_ADDG, {new_addg})
- PutLong({patch_addg}, old_addg)
- LEA store(PC), A0
- MOVE.L A4, (A0) /* Store the A4 register... */
- Wait(SIGBREAKF_CTRL_C)
- Raise(NO_ERR)
- EXCEPT
- IF old_addg THEN SetFunction(intuitionbase, OFF_ADDG, old_addg)
- IF old_ow THEN SetFunction(intuitionbase, OFF_OW, old_ow)
- IF old_open THEN SetFunction(dosbase, OFF_OPEN, old_open)
- IF old_exnext THEN SetFunction(dosbase, OFF_EXNEXT, old_exnext)
- IF old_exam THEN SetFunction(dosbase, OFF_EXAM, old_exam)
- IF iconbase THEN CloseLibrary(iconbase)
- IF utilitybase THEN CloseLibrary(utilitybase)
- IF whatisbase THEN CloseLibrary(whatisbase)
- IF rdargs THEN FreeArgs(rdargs)
- ENDPROC
-
- PROC freelist()
- DEF n:PTR TO ln
- n:=namelist.head
- WHILE n.succ
- deletenode(n)
- n:=n.succ
- ENDWHILE
- ENDPROC
-
- PROC deletenode(n:PTR TO ln)
- DisposeLink(n.name)
- Remove(n)
- Dispose(n)
- ENDPROC
-
- PROC addnode(fib:PTR TO fileinfoblock)
- DEF p:PTR TO ln, s, t
- t:=StrLen(fib.filename)
- s:=String(t+6)
- StringF(s, '\s.info', fib.filename)
- IF p:=Lock(s, ACCESS_READ)
- UnLock(p)
- DisposeLink(s)
- ELSE
- SetStr(s, t)
- t:=WhatIs(s, [WI_DEEP, DEEPTYPE, WI_FIB, fib, NIL])
- IF CmpFileType(t, icontype)<>CMP_EQUAL
- p:=New(SIZEOF ln)
- p.type:=t
- p.name:=s
- IF CmpFileType(t, exetype)<>CMP_EQUAL
- IF IsSubTypeOf(t, exetype)=FALSE
- fib.protection:=fib.protection OR FIBF_EXECUTE
- ENDIF
- ENDIF
- IF debug AND %01
- IF CmpFileType(t, TYPE_UNKNOWNFILETYPE)=CMP_EQUAL
- WriteF('Unknown file type for "\s"\n', p.name)
- ENDIF
- ENDIF
- AddHead(namelist, p)
- ENDIF
- ENDIF
- ENDPROC
-
- PROC iswb()
- DEF tsk:tc, l:ln
- tsk:=FindTask(NIL)
- IF tsk
- IF l:=tsk.ln
- IF l.name
- IF StrCmp(l.name, 'Workbench', ALL) THEN RETURN tsk
- ENDIF
- ENDIF
- ENDIF
- ENDPROC NIL
-
- PROC do_exnext()
- DEF fib, r
- MOVE.L D0, r
- MOVE.L D2, fib
- IF iswb()
- IF r=DOSTRUE THEN addnode(fib)
- ENDIF
- ENDPROC
-
- PROC do_exam()
- IF iswb()
- freelist()
- IF win
- /* This is a horrible, horrible hack... */
- win.extdata:=CurrentDir(0)
- CurrentDir(win.extdata)
- win:=NIL
- ENDIF
- ENDIF
- ENDPROC
-
- PROC nextname()
- DEF p:PTR TO ln, f:PTR TO ln
- p:=namelist.head
- f:=p
- WHILE p.succ
- IF Stricmp(f.name, p.name)>0 THEN f:=p
- p:=p.succ
- ENDWHILE
- RETURN f
- ENDPROC
-
- PROC tryfake()
- DEF n, i, t, s:PTR TO ln
- MOVE.L D1, i
- IF iswb() AND StrCmp(i, 'ENV:sys/def_', 12)
- s:=nextname()
- IF s.succ
- t:=GetIconName(s.type)
- IF t[]
- n:=StrLen(t)
- CopyMem(t, i+8, n)
- CopyMem('.info', i+8+n, 6)
- IF debug AND %10
- IF t:=Lock(i, ACCESS_READ)
- UnLock(t)
- ELSE
- WriteF('Couldn''t find icon "\s"\n', i)
- ENDIF
- ENDIF
- ENDIF
- deletenode(s)
- ENDIF
- ENDIF
- ENDPROC
-
- PROC do_ow()
- DEF w:PTR TO window
- MOVE.L D0, w
- IF iswb()
- win:=w
- ENDIF
- ENDPROC
-
- PROC do_addglist()
- DEF w:PTR TO window, i:PTR TO diskobject, p:PTR TO process, pw,
- g:PTR TO gadget, si:PTR TO stringinfo, len, dtl=0, iname
- MOVE.L A0, w
- MOVE.L A1, g
- IF p:=iswb()
- IF StrCmp(w.title, 'Execute a File', ALL) AND (w:=w.parent)
- IF w.extdata
- pw:=p.windowptr
- p.windowptr:=-1
- WHILE g
- IF g.gadgettype AND GTYP_STRGADGET
- IF si:=g.specialinfo
- /* Make use of the horrible, horrible hack... */
- dtl:=CurrentDir(w.extdata)
- iname:=GetIconName(WhatIs(si.buffer,[WI_DEEP,DEEPTYPE,NIL]))
- CurrentDir(dtl)
- IF iname[]
- len:=StrLen(si.buffer)
- CopyMem(si.buffer, si.undobuffer, len+1)
- CopyMem('ENV:sys/', si.buffer, 8)
- CopyMem(iname, si.buffer+8, StrLen(iname)+1)
- IF i:=GetDiskObject(si.buffer)
- dtl:=StrLen(i.defaulttool)
- IF dtl
- IF InStr(i.defaulttool, ' ', 0)<>NOT_FOUND
- PutChar(si.buffer, QUOTE)
- CopyMem(i.defaulttool, si.buffer+1, dtl)
- CopyMem('" ', si.buffer+dtl+1, 2)
- dtl:=dtl+3
- ELSE
- CopyMem(i.defaulttool, si.buffer, dtl)
- PutChar(si.buffer+dtl, " ")
- INC dtl
- ENDIF
- IF iname:=FindToolType(i.tooltypes, 'PRE_ARGS')
- CopyMem(iname, si.buffer+dtl, StrLen(iname))
- dtl:=dtl+StrLen(iname)
- PutChar(si.buffer+dtl, " ")
- INC dtl
- ENDIF
- si.bufferpos:=dtl
- CopyMem(si.undobuffer, si.buffer+dtl, len+1)
- dtl:=dtl+len
- IF iname:=FindToolType(i.tooltypes, 'POST_ARGS')
- PutChar(si.buffer+dtl, " ")
- INC dtl
- CopyMem(iname, si.buffer+dtl, StrLen(iname)+1)
- ENDIF
- ELSE
- CopyMem(si.undobuffer, si.buffer, len+1)
- ENDIF
- FreeDiskObject(i)
- ELSE
- CopyMem(si.undobuffer, si.buffer, len+1)
- ENDIF
- ENDIF
- ENDIF
- g:=NIL
- ENDIF
- IF g THEN g:=g.nextgadget
- ENDWHILE
- p.windowptr:=pw
- ENDIF
- ENDIF
- ENDIF
- ENDPROC
-
- /* Place to store A4 register */
- store: LONG 0
-
- /* Places to store real library call addresses */
- patch_addg: LONG 0
- patch_exam: LONG 0
- patch_exnext: LONG 0
- patch_open: LONG 0
- patch_ow: LONG 0
-
- new_addg:
- MOVEM.L D0-D7/A0-A6, -(A7)
- LEA store(PC), A4
- MOVE.L (A4), A4
- do_addglist()
- MOVEM.L (A7)+, D0-D7/A0-A6
- MOVE.L patch_addg(PC), -(A7)
- RTS
-
- new_ow:
- PEA start_ow(PC)
- MOVE.L patch_ow(PC), -(A7)
- RTS
- start_ow:
- MOVEM.L D0-D7/A0-A6, -(A7)
- LEA store(PC), A4
- MOVE.L (A4), A4
- do_ow()
- MOVEM.L (A7)+, D0-D7/A0-A6
- RTS
-
- new_exam:
- MOVEM.L D1-D7/A0-A6, -(A7)
- LEA store(PC), A4
- MOVE.L (A4), A4
- do_exam()
- MOVEM.L (A7)+, D1-D7/A0-A6
- MOVE.L patch_exam(PC), -(A7)
- RTS
-
- new_exnext:
- PEA start_exnext(PC)
- MOVE.L patch_exnext(PC), -(A7)
- RTS
- start_exnext:
- MOVEM.L D0-D7/A0-A6, -(A7)
- LEA store(PC), A4
- MOVE.L (A4), A4
- do_exnext()
- MOVEM.L (A7)+, D0-D7/A0-A6
- RTS
-
- new_open:
- MOVEM.L D1-D7/A0-A6, -(A7)
- LEA store(PC), A4
- MOVE.L (A4), A4
- tryfake()
- MOVEM.L (A7)+, D1-D7/A0-A6
- MOVE.L patch_open(PC), -(A7)
- RTS
-